package com.google.android.apps.wakemewhere.ui;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

import com.google.android.apps.wakemewhere.Alarm;
import com.google.android.apps.wakemewhere.AlarmArbiter;
import com.google.android.apps.wakemewhere.util.Preconditions;

public class GpsListenerAlarmArbiter implements AlarmArbiter {

	private List<Alarm> alarms = new ArrayList<Alarm>();
	private Context context;
	private Intent onFireIntent;

	GpsListenerAlarmArbiter(Context context) {
		Preconditions.nonNull(context);
		this.context = context;
	}

	public void setAlarms(List<Alarm> alarms) {
		alarms.clear();
		alarms.addAll(alarms);
	}

	public void setOnFireIntent(Intent onFireIntent) {
		Preconditions.nonNull(onFireIntent);
		this.onFireIntent = onFireIntent;
	}

	public void start() {
		final LocationManager locationManager = (LocationManager) context
				.getSystemService(Context.LOCATION_SERVICE);
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
				0, new AlarmLocationListener());
	}

	public Alarm checkForTrigger(Location location) {
		for (Alarm alarm : alarms) {
			if (alarm.triggersOn(location)) {
				return alarm;
			}
		}
		return null;
	}

	private class AlarmLocationListener implements LocationListener {
		public void onStatusChanged(String provider, int status, Bundle extras) {
		}

		public void onProviderEnabled(String provider) {
		}

		public void onProviderDisabled(String provider) {
		}

		public void onLocationChanged(Location location) {
			Alarm triggeredAlarm = checkForTrigger(location);
			if (triggeredAlarm == null) {
				return;
			}

			if (onFireIntent == null) {
				return;
			}
			triggeredAlarm.writeOnto(onFireIntent);
			context.startActivity(onFireIntent);
		}
	}
}
